package br.com.JZSolution.domineduplex.swing;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;

public class JProgressBarJZ extends JComponent implements MouseListener{
	
	private float porcentagem = 0;
	private Color corDeCima;
	private Color corDeBaixo;
	private int diametro;
	private int espacamento;
	private int incrementoHorizontal;
	private boolean mostrarTooltip = false;
	
	public static void main(String[] args) {
		JFrame frame = new JFrame();
		frame.setPreferredSize(new Dimension(165,85));
		frame.setTitle("TesteProgress");
		final JProgressBarJZ progress = new JProgressBarJZ();
		frame.add(progress,BorderLayout.CENTER);
		JButton btn = new JButton("Iniciar");
		btn.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e) {
				//iniciar
				Thread t = new Thread(){
					
					public void run() {
						for(float j = 0; j <= 100; j+=0.5){
							try {
								progress.setPorcentagem(j);
								Thread.sleep(100);
							} catch (InterruptedException e1) {
								e1.printStackTrace();
							}
						}
					}
				};
				t.start();
			}
			
		});
		frame.add(btn,BorderLayout.SOUTH);
		
		frame.pack();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
		
	}
	
	/**
	 * Criar o Progress Bar padrao
	 */
	public JProgressBarJZ(){
		corDeCima = Color.LIGHT_GRAY;
		corDeBaixo = Color.BLACK;
		diametro = 14;
		espacamento = 3;
		init();
	}
	/**
	 * Criar o Progress Bar
	 * @param diametro, da esfera
	 * @param espacamento, entre as esferas
	 */
	public JProgressBarJZ(int diametro,int espacamento){
		this();
		this.diametro = diametro;
		this.espacamento = espacamento;
		init();
	}
	/**
	 * Criar o Progress Bar
	 * @param diametro, da esfera
	 * @param espacamento, entre as esferas
	 * @param corDeCima, cor do gradiente na parte de cima da esfera
	 * @param corDeBaixo, cor do gradiente na parte de baixo da esfera
	 */
	public JProgressBarJZ(int diametro,int espacamento, Color corDeCima,Color corDeBaixo){
		this.corDeCima = corDeCima;
		this.corDeBaixo = corDeBaixo;
		this.diametro = diametro;
		this.espacamento = espacamento;
		init();
	}
	private void init(){
		this.addMouseListener(this);
		incrementoHorizontal = diametro + espacamento;
	}
	
	public void setPorcentagem(float per){
		porcentagem = per;
		repaint();
	}
	
	public Color getCorDeCima() {
		return corDeCima;
	}

	public void setCorDeCima(Color corDeCima) {
		this.corDeCima = corDeCima;
	}

	public Color getCorDeBaixo() {
		return corDeBaixo;
	}

	public void setCorDeBaixo(Color corDeBaixo) {
		this.corDeBaixo = corDeBaixo;
	}

	public int getDiametro() {
		return diametro;
	}

	public void setDiametro(int diametro) {
		this.diametro = diametro;
		incrementoHorizontal = diametro + espacamento;
	}

	public int getEspacamento() {
		return espacamento;
	}

	public void setEspacamento(int espacamento) {
		this.espacamento = espacamento;
		incrementoHorizontal = diametro + espacamento;
	}

	public float getPorcentagem() {
		return porcentagem;
	}
	public void setShowToolTip(boolean show){
		mostrarTooltip = show;
	}
	@Override
	public void paint(Graphics graph) {
		final int transpMinima = 70;
		int inicioX = 5;
		final int alturaY = (this.getHeight()/2)-diametro/2;
		Graphics2D g2d = (Graphics2D) graph;
		g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
		g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
		
		//verificar quantas bolas cabem
		int tamanho = this.getWidth();
		int bolas = (int)(tamanho /incrementoHorizontal);
		int resto = tamanho % incrementoHorizontal;
		float prop = bolas*porcentagem;
		int cheios = (int)(prop/100);
		int grau = (int)(prop%100);

		int x = (inicioX+resto/2)-inicioX/2 ;//setando o ponto inicial da primeira bolinha
		
		GradientPaint gp = new GradientPaint(x+diametro/2, alturaY, corDeCima, x+diametro/2, alturaY+diametro,corDeBaixo, true);
		g2d.setPaint(gp);
		for(int i = 0; i < cheios; i++){
			//Pinta as bolas completas
			g2d.fillOval(x, alturaY, diametro, diametro);
			x+= incrementoHorizontal;
			bolas--;
		}
		
		if(porcentagem != 0 && porcentagem != 100){
			//pinta a bola atual
			int fator = Math.min(255,((int)(grau*2.55) + transpMinima) );
			gp = new GradientPaint(x+diametro/2, alturaY, new Color(192,192,192,fator), x+diametro/2, alturaY+diametro,new Color(0,0,0,fator), false);
			g2d.setPaint(gp);
			g2d.fillOval(x, alturaY, diametro, diametro);
			x+= incrementoHorizontal;
			bolas--;
		}
		gp = new GradientPaint(x+diametro/2, alturaY, 
				new Color(corDeCima.getRed(),corDeCima.getGreen(),corDeCima.getBlue(),transpMinima),
				x+diametro/2, alturaY,
				new Color(corDeBaixo.getRed(),corDeBaixo.getGreen(),corDeBaixo.getBlue(),transpMinima), false);
		g2d.setPaint(gp);
		for(int i = 0; i < bolas; i++){
			//pinta as bolas faltando
			g2d.fillOval(x, alturaY, diametro, diametro);
			x+= incrementoHorizontal;
		}
		
		if(mostrarTooltip){
			int pos = tamanho/2 - 14 ;
			g2d.setColor( new Color(255,255,255,160));
			g2d.fillRoundRect(pos - 6,alturaY - 3, 55, 19, 10, 10);
			g2d.setColor(Color.BLACK);
			g2d.setFont(new Font("ARIAL",Font.BOLD,14));
			
			if(porcentagem < 10){
				pos+=8;
			}else if(porcentagem <100){
				pos+=4;
			}
			
			g2d.drawString( (porcentagem)+"%", pos, alturaY + 11 );
		}
	}
	
	public void mouseEntered(MouseEvent e) {
		mostrarTooltip = true;
		repaint();
	}
	public void mouseExited(MouseEvent e) {
		mostrarTooltip = false;
		repaint();
	}
	public void mouseClicked(MouseEvent e) {}
	public void mousePressed(MouseEvent e) {}
	public void mouseReleased(MouseEvent e) {}
}